package reflect;

import com.sun.xml.internal.messaging.saaj.packaging.mime.util.QEncoderStream;

import java.awt.geom.QuadCurve2D;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Scanner;

/**
 * Java反射机制
 * 反射是Java的动态机制 可以在程序[运行期间]再确定如:对象实例化
 * 方法调用属性操作
 * 反射机制可以大大的提高代码的灵活性和可扩展性 但是随之带来的较慢的运行
 * 效率和更多的系统开销 因此不能过度依赖反射机制
 */
public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
             Class类
             Class类的实例被称为类对象
             JVM在加载一个类的字节码文件到内部时就会实例化一个Class实例
             与加载的类对应,用这个Class实例记录加载的类的相关信息.并且
             在JVM内部每一个被加载的类[都有且只有一个]类对象与之对应

             获取一个类的类对象方式有
             1.类名.class

             2.Class.forName(String className)
             参数:类的完全限定名(包名.类名)
             Class cls = Class.forName

         */
//        Class cls = Character.class;
//        Class cls = Class.forName("reflect.Person");
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入类名");
        String classname = scan.next();
        Class cls = Class.forName(classname);
        String name = cls.getName();//获取类的完全限定名
        System.out.println(name);
        name = cls.getSimpleName();//仅获取类名
        System.out.println(name);


        /*
            Method类
            Method类的每一个实例称为"方法对象"
            该类的每个实例表示类中的一个方法 通过方法对象我们可以得知
            其表示的方法的相关信息 如方法名 返回值类型 参数个数
         */
        /*
            Class中的方法:
            Method[] getMethods()
            获取当前类对象所表示的类的所有公开方法
         */

        Method[] methods = cls.getMethods();
        System.out.println(name+"一共有"+methods.length+"个公开方法");
        for (Method method: methods){
            System.out.println(method.getName());
        }


    }
}
